home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / plnk081.zip / pilot-link.0.8.1 / libsock / address.c < prev    next >
C/C++ Source or Header  |  1997-08-03  |  5KB  |  204 lines

  1. /* address.c:  Translate Pilot address book data formats
  2.  *
  3.  * Copyright (c) 1996, Kenneth Albanowski
  4.  *
  5.  * This is free software, licensed under the GNU Public License V2.
  6.  * See the file COPYING for details.
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include "pi-source.h"
  13. #include "pi-socket.h"
  14. #include "pi-dlp.h"
  15. #include "pi-address.h"
  16.                         
  17. void free_Address(struct Address * a) {
  18.   int i;
  19.   for(i=0;i<19;i++)
  20.     if(a->entry[i])
  21.       free(a->entry[i]);
  22. }
  23.  
  24. #define hi(x) (((x) >> 4) & 0x0f)
  25. #define lo(x) ((x) & 0x0f)
  26. #define pair(x,y) (((x) << 4) | (y))
  27.  
  28. int unpack_Address(struct Address * a, unsigned char * buffer, int len) {
  29.   unsigned long contents;
  30.   unsigned long v;
  31.   unsigned char * start = buffer;
  32.   
  33.   if (len<9)
  34.     return 0;
  35.   
  36.   /*get_byte(buffer); gapfil*/
  37.   a->showPhone = hi(get_byte(buffer+1));
  38.   a->phoneLabel[4] = lo(get_byte(buffer+1));
  39.   a->phoneLabel[3] = hi(get_byte(buffer+2));
  40.   a->phoneLabel[2] = lo(get_byte(buffer+2));
  41.   a->phoneLabel[1] = hi(get_byte(buffer+3));
  42.   a->phoneLabel[0] = lo(get_byte(buffer+3));
  43.   
  44.   contents = get_long(buffer+4);
  45.   
  46.   /*get_byte(buffer+8) offset*/
  47.   
  48.   buffer += 9;
  49.   len -= 9;
  50.   
  51.   /*if(flag & 0x1) { 
  52.      a->lastname = strdup(buffer);
  53.      buffer += strlen(buffer) + 1;
  54.   } else {
  55.     a->lastname = 0;
  56.   }*/
  57.   
  58.   for(v=0;v<19;v++) {
  59.     if(contents & (1 << v)) {
  60.       if (len<1)
  61.         return 0;
  62.       a->entry[v] = strdup((char*)buffer);
  63.       buffer += strlen((char*)buffer)+1;
  64.       len -= strlen(a->entry[v])+1;
  65.     } else {
  66.       a->entry[v] = 0;
  67.     }
  68.   }
  69.   
  70.   return (buffer-start);
  71. }
  72.  
  73. int pack_Address(struct Address * a, unsigned char * record, int len) {
  74.   unsigned char *start = record;
  75.   unsigned char *buffer;
  76.   unsigned long contents;
  77.   unsigned long v;
  78.   unsigned long phoneflag;
  79.   unsigned char offset;
  80.   int l;
  81.  
  82.   int destlen = 9;
  83.   for(v=0;v<19;v++)
  84.     if(a->entry[v])
  85.       destlen += strlen(a->entry[v])+1;
  86.       
  87.   if (!record)
  88.     return destlen;
  89.   if (len<destlen)
  90.     return 0;
  91.  
  92.   buffer = record + 9;
  93.  
  94.   phoneflag = 0;
  95.   contents = 0;
  96.   offset = 0; /* FIXME: Check to see if this really should default to zero */
  97.  
  98.   for(v=0;v<19;v++) {
  99.     if(a->entry[v] && strlen(a->entry[v])) {
  100.       if(v==entryCompany)
  101.         offset = (unsigned char)(buffer-record);
  102.       contents |= (1 << v);
  103.       l = strlen(a->entry[v])+1;
  104.       memcpy(buffer,a->entry[v],l);
  105.       buffer+=l;
  106.     }
  107.   }
  108.   
  109.   phoneflag  = ((unsigned long)a->phoneLabel[0]) << 0;
  110.   phoneflag |= ((unsigned long)a->phoneLabel[1]) << 4;
  111.   phoneflag |= ((unsigned long)a->phoneLabel[2]) << 8;
  112.   phoneflag |= ((unsigned long)a->phoneLabel[3]) << 12;
  113.   phoneflag |= ((unsigned long)a->phoneLabel[4]) << 16;
  114.   phoneflag |= ((unsigned long)a->showPhone)  << 20;
  115.  
  116.   set_long(record, phoneflag);
  117.   set_long(record+4, contents);
  118.   set_byte(record+8, offset);
  119.   
  120.   return (buffer-start);
  121. }
  122.  
  123. int unpack_AddressAppInfo(struct AddressAppInfo * ai, unsigned char * record, int len) {
  124.   int i;
  125.   unsigned char * start = record;
  126.   unsigned long r;
  127.   int destlen = 4+16*22+2+2;
  128.   i = unpack_CategoryAppInfo(&ai->category, record, len);
  129.   if (!record)
  130.       return i+destlen;
  131.   if (!i)
  132.       return i;
  133.   record += i;
  134.   len -= i;
  135.  
  136.   if (len < destlen)
  137.       return 0;
  138.  
  139.   r = get_long(record);
  140.   for(i=0;i<22;i++)
  141.     ai->labelRenamed[i] = !!(r & (1<<i));
  142.     
  143.   record += 4;
  144.   memcpy(ai->labels,record, 16*22);
  145.   record += 16*22;
  146.   ai->country = get_short(record);
  147.   record+=2;
  148.   ai->sortByCompany = get_byte(record);
  149.   record +=2;
  150.   
  151.   for(i=3;i<8;i++)
  152.     strcpy(ai->phoneLabels[i-3],ai->labels[i]);
  153.   for(i=19;i<22;i++)
  154.     strcpy(ai->phoneLabels[i-19+5],ai->labels[i]);
  155.   
  156.   return (record-start);
  157. }
  158.  
  159. int pack_AddressAppInfo(struct AddressAppInfo * ai, unsigned char * record, int len)
  160. {
  161.   int i;
  162.   unsigned char * pos = record;
  163.   unsigned long r;
  164.   int destlen = 4+16*22+2+2;
  165.   
  166.  
  167.   i = pack_CategoryAppInfo(&ai->category, record, len);
  168.   if (!record)
  169.     return destlen+i;
  170.   if (!i)
  171.     return i;
  172.     
  173.   pos += i;
  174.   len -= i;
  175.  
  176.   for(i=3;i<8;i++)
  177.     strcpy(ai->phoneLabels[i-3],ai->labels[i]);
  178.   for(i=19;i<22;i++)
  179.     strcpy(ai->phoneLabels[i-19+5],ai->labels[i]);
  180.   
  181.   memset(pos, 0, destlen);
  182.   
  183.   r = 0;
  184.   for(i=0;i<22;i++)
  185.     if (ai->labelRenamed[i])
  186.       r |= (1<<i);
  187.   set_long(pos, r);
  188.   pos+= 4;
  189.  
  190.   memcpy(pos, ai->labels, 16*22);
  191.   pos += 16*22;
  192.   set_short(pos, ai->country);
  193.   pos+=2;
  194.   set_byte(pos, ai->sortByCompany);
  195.   pos+=2;
  196.   
  197.   for(i=3;i<8;i++)
  198.     strcpy(ai->phoneLabels[i-3],ai->labels[i]);
  199.   for(i=19;i<22;i++)
  200.     strcpy(ai->phoneLabels[i-19+5],ai->labels[i]);
  201.   
  202.   return (pos-record);
  203. }
  204.